from prophet import Prophet
import numpy as np
import pandas as pd

file_path = 'XMD2023.csv'
# file_path = 'LYG2023.csv'
# file_path = 'XMN2023.csv'

file_name = list(file_path.split('.')[0][-1:-5:-1])
file_name.reverse()
year = ('').join(file_name)

df = pd.read_csv(file_path)
# 在 Date 列的值后面加上 year 作为年份前缀，然后将 Date 和 Time 合并为日期时间列
df['ds'] = pd.to_datetime(year + df['Date'].astype(str) + ' ' + df['Time'].astype(str) + ':00:00', format='%Y%j %H:%M:%S')

# 准备气压数据
pressure_df = df[['ds', 'Air_Pressure']].rename(columns={'Air_Pressure': 'y'})

# 准备海面温度数据
temperature_df = df[['ds', 'Sea_Temperature']].rename(columns={'Sea_Temperature': 'y'})

# 创建并拟合气压 Prophet 模型
pressure_model = Prophet()
pressure_model.fit(pressure_df)

# 创建并拟合海面温度 Prophet 模型
temperature_model = Prophet()
temperature_model.fit(temperature_df)

# 创建未来三天的日期数据
future_dates = pressure_model.make_future_dataframe(periods=3, freq='h')

# 预测气压值
pressure_forecast = pressure_model.predict(future_dates)
pressure_forecast_last_three = pressure_forecast[['ds', 'yhat']].tail(3).rename(columns={'yhat': 'Air_Pressure_Prediction'}).round(2)

# 预测海面温度值
temperature_forecast = temperature_model.predict(future_dates)
temperature_forecast_last_three = temperature_forecast[['ds', 'yhat']].tail(3).rename(columns={'yhat': 'Sea_Temperature_Prediction'}).round(2)

# 合并气压和海面温度的预测结果
combined_forecast = pd.merge(pressure_forecast_last_three, temperature_forecast_last_three, on='ds')

# 找出历史浪高的最高峰
historical_max_wave_height = df['Wind_Wave_Height'].max()

# 找出历史浪高最高峰的索引
historical_max_index = df['Wind_Wave_Height'].idxmax()

# 从历史最高峰之后的数据开始找下一个可能的最高峰
remaining_data = df.loc[historical_max_index + 1:, 'Wind_Wave_Height']

# 如果剩余数据为空，则认为不会出现下一个最高峰
if remaining_data.empty:
    next_peak_days = np.nan
else:
    # 找出下一个浪高的最高峰
    next_max_wave_height = remaining_data.max()
    # 找出下一个浪高最高峰的索引
    next_max_index = remaining_data.idxmax()
    # 计算距离下一次浪高最高峰的小时数
    next_peak_hours = (next_max_index - historical_max_index)
    # 将小时数转换为天数
    next_peak_days = round(next_peak_hours / 24, 3)

# 计算海浪平均峰值周期（Wind_Wave_Period列的平均值）
average_wave_period = round(df['Wind_Wave_Period'].mean(), 2)

print('未来三天的气压值和海面温度值预测结果：')
print(combined_forecast)
print(f'下一次浪高最高峰预计在 {next_peak_days} 天后出现')
print(f'海浪平均峰值周期为 {average_wave_period} 秒')